<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    // Promise 
    // Promise异步编程的一种解决方法 (没有改变异步的本质, 只是通过封装让异步变得更像同步代码)

    // 所谓Promise，简单说就是一个容器，里面保存着某个未来才会结束的事件（通常是一个异步操作）的结果。从语法上说，Promise 是一个对象，从它可以获取异步操作的消息。Promise 提供统一的 API，各种异步操作都可以用同样的方法进行处理。

    // 如何创建Promise实例/Promise对象   => 构造函数创建
    // 1. new Promise接收一个函数(回调函数) -> 此函数用于接收要执行的代码(当前函数数据同步任务 -> new Promise() 传入函数时立即执行)
    // 2. 回调函数中有两个形参resolve reject, 用于改变Promise实例状态和存储数据的方法  => 异步操作的结果不是自定改变的 => 而是用户根据代码的执行结果手动设置的

    // resolve() 将Promise实例的状态由pending(进行中)改为fulfilled(已成功)
    // rejected()  将Promise实例的状态由pending(进行中)改为rejected(已失败)
    // resolve()  rejected()都可以接收一个实参,作为Promise实例存储的数据

    // 本质上: Promise对象就是一个状态机,对应异步操作的不同状态 => 后续也可以对应不同的状态执行不同的操作   

    // Promise的状态:
    // pending    进行中(异步操作还在进行)
    // fulfilled/resolved  已成功
    // rejected   已失败

    // var p = new Promise(function(){
    //     //  回调函数 => 容器 => 用于存放要执行的代码(通常是异步代码,同步也可以)
        
        
    // });
    // console.log(p);   // {<pending>:undefined}
    // {
    //     [[PromiseState]]:"pending",  // Promise的状态
    //     [[PromiseResult]]:undefined  // Promise的结果
    // }
    

    // 如何改变Promise的状态?

    // 同步代码 -> 立即改变状态
    // console.log(1);
    // var p = new Promise(function(resolve,reject){
    //     //  回调函数 => 容器 => 用于存放要执行的代码(通常是异步代码,同步也可以)
    //     // 当前函数数据同步任务 -> new Promise() 传入函数时立即执行
    //     console.log(2);
    //     // resolve("11111111");
    //     reject(22222222);
    // });
    // console.log(3);
    // console.log(p);   // {<pending>:undefined}


    // 异步代码 => 先执行同步任务 => 等所有同步任务执行完毕 => 异步代码有结果 => 在根据结果改变状态  (老赖行为)

 /*    debugger;
    console.log(1);
    var p = new Promise(function(resolve,reject){
        //  回调函数 => 容器 => 用于存放要执行的代码(通常是异步代码,同步也可以)
        // 当前函数数据同步任务 -> new Promise() 传入函数时立即执行
        console.log(2);
        setTimeout(()=>{
            debugger;
            console.log(4,"异步代码开始执行");
            var num = Math.random(); // 0-1
            console.log(num);

            if(num >= 0.5){ // 正面
                resolve("老王不拖堂");
            }else{
                reject("老王说,该拖还要拖");
            }
            console.log(p);
        },2000)
    });
    console.log(3);
    console.log(p);   // {<pending>:undefined} */
     
 


  


</script>
</html>